import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

/// 日期选择器模式
enum CustomDatePickerMode {
  /// 单选日期
  single,
  /// 范围选择日期
  range,
}

/// 一个简化的时间段选择器或单日期选择器，基于系统的 CupertinoDatePicker。
class DateRangePicker {
  static void show({
    required BuildContext context,
    required DateTime minDate,
    required DateTime maxDate,
    CustomDatePickerMode mode = CustomDatePickerMode.range,
    // 范围选择相关参数
    DateTime? initialStartDate,
    DateTime? initialEndDate,
    void Function(DateTime start, DateTime end)? onStartEndConfirm,
    // 单选日期相关参数
    DateTime? initialDate,
    void Function(DateTime date)? onConfirm,
  }) {
    // 参数校验
    if (mode == CustomDatePickerMode.range) {
      assert(initialStartDate != null && initialEndDate != null && onStartEndConfirm != null,
      '对于范围模式，必须提供initialStartDate、initialEndDate和onStartEndConfirm。');
    } else { // mode == DatePickerMode.single
      assert(initialDate != null && onConfirm != null,
      '对于单一模式，必须提供initialDate和onConfirm。');
    }

    // 截断到纯日期（忽略时分秒）
    final DateTime min = DateTime(minDate.year, minDate.month, minDate.day);
    final DateTime max = DateTime(maxDate.year, maxDate.month, maxDate.day);

    // 可变的状态变量
    late DateTime currentStart;
    late DateTime currentEnd;
    late DateTime currentSingleDate;

    if (mode == CustomDatePickerMode.range) {
      currentStart = DateTime(
        initialStartDate!.year,
        initialStartDate.month,
        initialStartDate.day,
      );
      currentEnd = DateTime(
        initialEndDate!.year,
        initialEndDate.month,
        initialEndDate.day,
      );

      // clamp 初始值到 [min, max] for range
      if (currentStart.isBefore(min)) currentStart = min;
      if (currentStart.isAfter(max)) currentStart = max;
      if (currentEnd.isBefore(min)) currentEnd = min;
      if (currentEnd.isAfter(max)) currentEnd = max;
      // 确保 start 不在 end 之后 (如果初始值如此，则将 start 设为 end)
      // 注意：原代码没有在初始化时强制 start <= end，而是在交互中处理。
      // 为保持一致，这里也只做范围限制。交互时的逻辑会保证 start <= end。
      // 如果需要初始化时就保证，可以添加: if (currentStart.isAfter(currentEnd)) currentStart = currentEnd;
      // 但更常见的做法可能是将 end 调整为不小于 start: if (currentEnd.isBefore(currentStart)) currentEnd = currentStart;

    } else { // mode == DatePickerMode.single
      currentSingleDate = DateTime(
        initialDate!.year,
        initialDate.month,
        initialDate.day,
      );
      // clamp 初始值到 [min, max] for single
      if (currentSingleDate.isBefore(min)) currentSingleDate = min;
      if (currentSingleDate.isAfter(max)) currentSingleDate = max;
    }


    showModalBottomSheet<void>(
      context: context,
      isScrollControlled: true,
      backgroundColor: Colors.white,
      shape: const RoundedRectangleBorder(
        borderRadius: BorderRadius.vertical(top: Radius.circular(12)),
      ),
      builder: (_) => SafeArea(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            // 顶部操作栏
            Container(
              height: 54,
              decoration: BoxDecoration(
                border: Border(bottom: BorderSide(color: Colors.grey[300]!)),
              ),
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  CupertinoButton(
                    padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),
                    child: const Text('取消'),
                    onPressed: () => Navigator.of(context).pop(),
                  ),
                  CupertinoButton(
                    padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),
                    child: const Text('确定'),
                    onPressed: () {
                      Navigator.of(context).pop();
                      if (mode == CustomDatePickerMode.range) {
                        onStartEndConfirm!(currentStart, currentEnd);
                      } else {
                        onConfirm!(currentSingleDate);
                      }
                    },
                  ),
                ],
              ),
            ),

            // 日期选择器部分
            if (mode == CustomDatePickerMode.single)
            // 单日期选择器
              _buildDatePickerWidget(
                initialDateTime: currentSingleDate,
                minDate: min,
                maxDate: max,
                onChanged: (DateTime dt) {
                  final DateTime truncated = DateTime(dt.year, dt.month, dt.day);
                  // CupertinoDatePicker 内部会处理 min/max date 的限制
                  // 但为保险起见，可以再次 clamp (原代码逻辑)
                  if (truncated.isBefore(min)) {
                    currentSingleDate = min;
                  } else if (truncated.isAfter(max)) {
                    currentSingleDate = max;
                  } else {
                    currentSingleDate = truncated;
                  }
                },
              )
            else ...[
              // 开始日期选择器 (范围选择)
              _buildDatePickerWidget(
                initialDateTime: currentStart,
                minDate: min,
                maxDate: max, // 对于开始日期选择器，其理论最大可选日期是 currentEnd
                // 但 CupertinoDatePicker 的 maxDate 是固定范围，
                // 所以我们依赖 onDateTimeChanged 来做动态约束。
                // 或者，可以考虑在 currentEnd 改变时重建这个 picker，但这会增加复杂性。
                // 原代码也是用 max 作为 picker 的 maximumDate。
                onChanged: (DateTime dt) {
                  final DateTime truncated = DateTime(dt.year, dt.month, dt.day);
                  DateTime newStart = truncated;

                  if (newStart.isBefore(min)) {
                    newStart = min;
                  }
                  // 如果选择的开始日期在当前结束日期之后，则将开始日期设置为当前结束日期
                  if (newStart.isAfter(currentEnd)) {
                    newStart = currentEnd;
                  }
                  // 再次确保不超出 overall max (虽然 picker 本身有 maxDate，但 currentEnd 可能小于 max)
                  if (newStart.isAfter(max)) {
                    newStart = max;
                  }
                  currentStart = newStart;
                },
              ),
              const Divider(height: 1),
              // 结束日期选择器 (范围选择)
              _buildDatePickerWidget(
                initialDateTime: currentEnd,
                minDate: min, // 类似地，结束日期选择器的理论最小可选日期是 currentStart
                maxDate: max,
                onChanged: (DateTime dt) {
                  final DateTime truncated = DateTime(dt.year, dt.month, dt.day);
                  DateTime newEnd = truncated;

                  if (newEnd.isAfter(max)) {
                    newEnd = max;
                  }
                  // 如果选择的结束日期在当前开始日期之前，则将结束日期设置为当前开始日期
                  if (newEnd.isBefore(currentStart)) {
                    newEnd = currentStart;
                  }
                  // 再次确保不超出 overall min (虽然 picker 本身有 minDate，但 currentStart 可能大于 min)
                  if (newEnd.isBefore(min)) {
                    newEnd = min;
                  }
                  currentEnd = newEnd;
                },
              ),
            ],
          ],
        ),
      ),
    );
  }

  /// 辅助方法构建单个 CupertinoDatePicker 组件
  static Widget _buildDatePickerWidget({
    required DateTime initialDateTime,
    required DateTime minDate,
    required DateTime maxDate,
    required ValueChanged<DateTime> onChanged,
  }) {
    return SizedBox(
      height: 200,
      child: CupertinoDatePicker(
        mode: CupertinoDatePickerMode.date,
        initialDateTime: initialDateTime, //确保这个 initialDateTime 已经在 minDate 和 maxDate 之间
        minimumDate: minDate,
        maximumDate: maxDate,
        minimumYear: minDate.year,
        maximumYear: maxDate.year,
        onDateTimeChanged: onChanged,
        use24hFormat: true, // 对于日期选择器此参数影响不大，但保持一致
      ),
    );
  }
}